// 全局错误捕获中间件
module.exports = () => {
  return async function errorHandler(ctx, next) {
    try {
      await next();
    } catch (_err) {
      const err: any = _err;
      const { status = 500, message } = err;
      // 所有的异常都在 app 上触发一个 error 事件，框架会记录一条错误日志
      ctx.app.emit('error', err, ctx);
      // 生产环境时 500 错误的详细错误内容不返回给客户端，因为可能包含敏感信息
      const msg = status && ctx.app.config.env === 'prod' ? '系统发生错误' : message;
      ctx.status = status;
      ctx.error({
        msg,
        code: status,
        data: null,
      });
    }
  };
};